package sockets;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketTimeoutException;
import javax.swing.JTextArea;

/*
 * @author Danilo
 * @author Julio
 */

public class ClienteUDP extends Thread{
    // Variaveis que recebem a mensagem enviada, o hostname para abrir a conexão com o servidor e a porta de comunicação.
    protected String msgUDP, hostName;
    protected int portaUDP;
    
    // Variavel responsável por mostrar na tela as mensagens de comunicação com o servidor.
    protected JTextArea clienteOut;
    public ClienteUDP(JTextArea saida){
         clienteOut = saida;
    }

    @Override
    public void run(){
        try{
            // Cria uma variável que recebe o endereço de conexão com o servidorUDO pelo usuário.
            InetAddress address = InetAddress.getByName(hostName);
            
            // Cria um socket com um ponto envio de pacotes. 
            DatagramSocket socketOut = new DatagramSocket(1300);
            
            // Cria um vetor de byte.
            byte [] dadosOut = new byte[1024];
            
            // Mostra na tela que o clienteUDP esta enviando mensagem para o servidorUDP
            clienteOut.append("Cliente UDP esta enviando mensagem\n");
            // Mensagem enviada ao servidorUDP.
            String saida = msgUDP;
            
            // Variável dadosOut recebe os bytes que sera enviada ao servidorUDP.
            dadosOut = saida.getBytes();
            
            // Cria um pacote contendo os dados a serem enviados, o endereço e a porta de comucanição com o servidorUDP.
            DatagramPacket pacoteOut = new DatagramPacket(dadosOut, dadosOut.length, address, portaUDP);
            
            // Envia o pacote de mensagem.
            socketOut.send(pacoteOut);
            
            // Fecha o socket.
            socketOut.close();

            // Cria um socket com um ponto de recebimento de pacotes.
            DatagramSocket socketIn = new DatagramSocket(1300);
            byte[] dadosIn = new byte[1024];

                // Cria pacote para receber os dados.
                DatagramPacket pacoteIn = new DatagramPacket(dadosIn , dadosIn.length);

                // Define 1 segundo de timeout.
                socketIn.setSoTimeout(3000);

                // Se ocorrer timeout ele não imprime o dado na tela e fecha o socket.
                

                // Aceita os dados do servidor.
                socketIn.receive(pacoteIn);

                // Mensagem recebida do servidor.
                String resposta = new String(pacoteIn.getData());
                
                // Fecha o socket.
                socketIn.close();
                
            } catch (IOException e) {}
    }
}